package com.bjc.chapter08;

/**
 * @program: jvm_demo
 * @description: 逃逸分析
 * 如何快速的判断是否发生了逃逸分析，就看new的对象实体是否有可能在方法外被调用
 * @author: bjc
 * @create: 2022-01-20 21:50
 */
public class EscapeAnalysis {

    private EscapeAnalysis obj;

    /**
     * 方法返回EscapeAnalysis对象，发生逃逸
     *
     * @return
     */
    public EscapeAnalysis getInstance() {
        return obj == null ? new EscapeAnalysis() : obj;
    }

    /**
     * 成员属性复制，发生逃逸
     */
    public void setObj() {
        this.obj = new EscapeAnalysis();
    }

    //思考：如果当前的obj引用生命为static的？ 答：仍然会发生逃逸

    /**
     * 对象的作用域尽在当前方法中有效，没有发生逃逸
     */
    public void useEscapeAnalysis(){
        EscapeAnalysis e = new EscapeAnalysis();
    }

    /**
     * 引用成员变量的值：发生逃逸  TODO 这里考虑的是对象本身  不是对象的引用
     */
    public void useEscapeAnalysis1(){
        EscapeAnalysis e = getInstance();
    }
}
